package main

import "fmt"

// 闭包是一个函数,这个函数包含了他外部作用域的一个变量

func f1(f func()) {
	fmt.Println("this is f1")
	f()
}
func f2(x, y int) {
	fmt.Println("this is f2")
	fmt.Println(x + y)
}

// 定义一个函数对f2函数包装
func f3(f func(int, int), x, y int) func() {
	tmp := func() {
		f(x, y)
		fmt.Println("lalala")
	}
	return tmp
}

func main() {
	f := f3(f2, 1, 2)
	fmt.Printf("%T\n", f) // func()
	f1(f)
}
